﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Fuyao.Business.Entities.Models;
using System.Data.Common;

namespace Fuyao.Data.SQLServer.DAO
{
    public class DAOUsuario
    {
        string strCnx = clsConexionDB.getConexionSQL();


        public Usuario getUser(string username, string password)
        {

            Usuario oUsuario = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("SELECT UsuarioID, Nombre,ApellidoPaterno,ApellidoMaterno,Telefono,UserName,Password,FechaCreacion,Estado,PerfilID ");
                strCommand.Append("FROM Usuario WHERE UserName = @username and Password = @password ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);

                sqlCommand.Parameters.Add("@username", SqlDbType.VarChar, 20).Value = username;
                sqlCommand.Parameters.Add("@password", SqlDbType.VarChar, 20).Value = password;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oUsuario = new Usuario();
                    if (!Convert.IsDBNull(dr["UsuarioID"])) oUsuario.UsuarioID = Convert.ToInt32(dr["UsuarioID"]);
                    if (!Convert.IsDBNull(dr["Nombre"])) oUsuario.Nombre = Convert.ToString(dr["Nombre"]);
                    if (!Convert.IsDBNull(dr["ApellidoPaterno"])) oUsuario.ApellidoPaterno = Convert.ToString(dr["ApellidoPaterno"]);
                    if (!Convert.IsDBNull(dr["ApellidoMaterno"])) oUsuario.ApellidoMaterno = Convert.ToString(dr["ApellidoMaterno"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oUsuario.Telefono = Convert.ToString(dr["Telefono"]);
                    if (!Convert.IsDBNull(dr["UserName"])) oUsuario.UserName = Convert.ToString(dr["UserName"]);
                    if (!Convert.IsDBNull(dr["Password"])) oUsuario.Password = Convert.ToString(dr["Password"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oUsuario.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oUsuario.Estado = Convert.ToBoolean(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["PerfilID"])) oUsuario.PerfilID = Convert.ToInt32(dr["PerfilID"]);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oUsuario;
        }

        public Usuario getUsuarioByUsuarioID(int UsuarioID)
        {
            Usuario oUsuario = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("select UsuarioID,Nombre,ApellidoPaterno,ApellidoMaterno,Telefono,UserName,Password,Estado,PerfilID from dbo.Usuario where UsuarioID=@UsuarioID ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                sqlCommand.Parameters.Add("@UsuarioID", SqlDbType.Int).Value = UsuarioID;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oUsuario = new Usuario();
                    if (!Convert.IsDBNull(dr["UsuarioID"])) oUsuario.UsuarioID = Convert.ToInt32(dr["UsuarioID"]);
                    if (!Convert.IsDBNull(dr["Nombre"])) oUsuario.Nombre = Convert.ToString(dr["Nombre"]);
                    if (!Convert.IsDBNull(dr["ApellidoPaterno"])) oUsuario.ApellidoPaterno = Convert.ToString(dr["ApellidoPaterno"]);
                    if (!Convert.IsDBNull(dr["ApellidoMaterno"])) oUsuario.ApellidoMaterno = Convert.ToString(dr["ApellidoMaterno"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oUsuario.Telefono = Convert.ToString(dr["Telefono"]);
                    if (!Convert.IsDBNull(dr["UserName"])) oUsuario.UserName = Convert.ToString(dr["UserName"]);
                    if (!Convert.IsDBNull(dr["Password"])) oUsuario.Password = Convert.ToString(dr["Password"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oUsuario.Estado = Convert.ToBoolean(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["PerfilID"])) oUsuario.PerfilID = Convert.ToInt32(dr["PerfilID"]);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oUsuario;
        }

        public List<Usuario> getAllUsers()
        {

            Usuario oUsuario = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<Usuario> listUsuarios = new List<Usuario>();

            try
            {
                strCommand.Append("SELECT Us.UsuarioID, Us.Nombre,Us.ApellidoPaterno,Us.ApellidoMaterno,Us.Telefono,Us.UserName,Us.Password,Us.FechaCreacion,Us.Estado,Us.PerfilID,Upper(Perf.DescripcionPerfil) DescripcionPerfil ");
                strCommand.Append("FROM Usuario Us inner join Perfil Perf on Us.PerfilID=Perf.PerfilID where Us.Estado=@Estado order by 2,3 ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@Estado", SqlDbType.VarChar, 20).Value = true;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oUsuario = new Usuario();
                    if (!Convert.IsDBNull(dr["UsuarioID"])) oUsuario.UsuarioID = Convert.ToInt32(dr["UsuarioID"]);
                    if (!Convert.IsDBNull(dr["Nombre"])) oUsuario.Nombre = Convert.ToString(dr["Nombre"]);
                    if (!Convert.IsDBNull(dr["ApellidoPaterno"])) oUsuario.ApellidoPaterno = Convert.ToString(dr["ApellidoPaterno"]);
                    if (!Convert.IsDBNull(dr["ApellidoMaterno"])) oUsuario.ApellidoMaterno = Convert.ToString(dr["ApellidoMaterno"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oUsuario.Telefono = Convert.ToString(dr["Telefono"]);
                    if (!Convert.IsDBNull(dr["UserName"])) oUsuario.UserName = Convert.ToString(dr["UserName"]);
                    if (!Convert.IsDBNull(dr["Password"])) oUsuario.Password = Convert.ToString(dr["Password"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oUsuario.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oUsuario.Estado = Convert.ToBoolean(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["PerfilID"])) oUsuario.PerfilID = Convert.ToInt32(dr["PerfilID"]);
                    if (!Convert.IsDBNull(dr["DescripcionPerfil"])) oUsuario.DescripcionPerfil = Convert.ToString(dr["DescripcionPerfil"]);
                    listUsuarios.Add(oUsuario);     
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listUsuarios;
        }

        public bool InsertUser(Usuario BE)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("INSERT INTO dbo.Usuario (Nombre, ApellidoPaterno, ApellidoMaterno, Telefono, UserName, Password,CreadoPor, FechaCreacion, Estado, PerfilID) ");
                strCommand.Append("VALUES (@Nombre,@ApellidoPaterno,@ApellidoMaterno,@Telefono,@UserName,@Password,@CreadoPor,getDate(), 1,@PerfilID)");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@Nombre", SqlDbType.VarChar, 30).Value = BE.Nombre;
                sqlCommand.Parameters.Add("@ApellidoPaterno", SqlDbType.VarChar, 50).Value = BE.ApellidoPaterno;
                sqlCommand.Parameters.Add("@ApellidoMaterno", SqlDbType.VarChar, 50).Value = BE.ApellidoMaterno;
                sqlCommand.Parameters.Add("@Telefono", SqlDbType.VarChar, 50).Value = BE.Telefono;
                sqlCommand.Parameters.Add("@UserName", SqlDbType.VarChar, 20).Value = BE.UserName;
                sqlCommand.Parameters.Add("@Password", SqlDbType.VarChar, 20).Value = BE.Password;
                sqlCommand.Parameters.Add("@PerfilID", SqlDbType.Int).Value = BE.PerfilID;
                sqlCommand.Parameters.Add("@CreadoPor", SqlDbType.Int).Value = BE.CreadoPor;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());
               
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

        public bool UpdateUser(Usuario BE)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Usuario set Nombre=@Nombre, ApellidoPaterno=@ApellidoPaterno, ApellidoMaterno=@ApellidoMaterno, Telefono=@Telefono, UserName=@UserName, Password=@Password, Estado=@Estado, PerfilID=@PerfilID,FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE UsuarioID = @UsuarioID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@UsuarioID", SqlDbType.Int).Value = BE.UsuarioID;
                sqlCommand.Parameters.Add("@Nombre", SqlDbType.VarChar, 30).Value = BE.Nombre;
                sqlCommand.Parameters.Add("@ApellidoPaterno", SqlDbType.VarChar, 50).Value = BE.ApellidoPaterno;
                sqlCommand.Parameters.Add("@ApellidoMaterno", SqlDbType.VarChar, 50).Value = BE.ApellidoMaterno;
                sqlCommand.Parameters.Add("@Telefono", SqlDbType.VarChar, 50).Value = BE.Telefono;
                sqlCommand.Parameters.Add("@UserName", SqlDbType.VarChar, 20).Value = BE.UserName;
                sqlCommand.Parameters.Add("@Password", SqlDbType.VarChar, 20).Value = BE.Password;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = BE.Estado;
                sqlCommand.Parameters.Add("@PerfilID", SqlDbType.Int).Value = BE.PerfilID;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = BE.CreadoPor;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

        public bool DeleteUser(int? idUser,int idUserLogueado)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Usuario set Estado=@Estado,FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE UsuarioID = @UsuarioID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@UsuarioID", SqlDbType.Int).Value = idUser;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = false;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = idUserLogueado;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

        public List<Usuario> getUsersByFilter(string nombUser,string apeUser,bool estUser)
        {

            Usuario oUsuario = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<Usuario> listUsuarios = new List<Usuario>();

            try
            {
                strCommand.Append("FYAO_getUsersByFiler");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@Nombres", SqlDbType.VarChar, 30).Value = nombUser;
                sqlCommand.Parameters.Add("@Apellidos", SqlDbType.VarChar, 100).Value = apeUser;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = estUser;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oUsuario = new Usuario();
                    if (!Convert.IsDBNull(dr["UsuarioID"])) oUsuario.UsuarioID = Convert.ToInt32(dr["UsuarioID"]);
                    if (!Convert.IsDBNull(dr["Nombre"])) oUsuario.Nombre = Convert.ToString(dr["Nombre"]);
                    if (!Convert.IsDBNull(dr["ApellidoPaterno"])) oUsuario.ApellidoPaterno = Convert.ToString(dr["ApellidoPaterno"]);
                    if (!Convert.IsDBNull(dr["ApellidoMaterno"])) oUsuario.ApellidoMaterno = Convert.ToString(dr["ApellidoMaterno"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oUsuario.Telefono = Convert.ToString(dr["Telefono"]);
                    if (!Convert.IsDBNull(dr["UserName"])) oUsuario.UserName = Convert.ToString(dr["UserName"]);
                    if (!Convert.IsDBNull(dr["Password"])) oUsuario.Password = Convert.ToString(dr["Password"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oUsuario.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oUsuario.Estado = Convert.ToBoolean(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["PerfilID"])) oUsuario.PerfilID = Convert.ToInt32(dr["PerfilID"]);
                    if (!Convert.IsDBNull(dr["DescripcionPerfil"])) oUsuario.DescripcionPerfil = Convert.ToString(dr["DescripcionPerfil"]);
                    listUsuarios.Add(oUsuario);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listUsuarios;
        }
    }

}
